package com.AdvancedDemos.FileAndIO;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;

public class 转换流 {
    public static void main(String[] args) throws IOException {
        //1.将GBK文件内容读取到UTF-8程序中,乱码
        //2.将UTF-8内容追加写入到GBK文件中,原内容不乱码,追加的内容出现乱码

        //产生原因:
        //文件编码GBK和程序编码UTF-8不一致

        //解决方案:
        //以文件编码格式GBK为准,进行读写操作

        //JDK11之前的操作方案:使用InputStreamReader和OutputStreamWriter
        //转换流是字节流和字符流转换的桥梁,可以完成指定编码的读和写操作

        //字符流中FileReader的构造函数只接收了字节输入流,传递给父类InputStreamReader的构造函数,由父类InputStreamReader添加了编码表

        //InputStreamReader:将FileInputStream(字节流)转换为FileReader(字符流),中间添加编码表
        /*InputStreamReader reader = new InputStreamReader(new FileInputStream("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\my.txt"), "GBK");*///今晚打老虎 ; my.txt为GBK编码方式,此处指定编码为UTF-8将会乱码������ϻ�
        //读取操作,因为将字节输入流转换成了字符输入流,所以读取时读取的是字符
        /*int ch;
        while ((ch = reader.read()) != -1) {
            System.out.print((char) ch);
        }
        reader.close();
        System.out.println();*/
//       BufferedReader bufferedReader = new BufferedReader(reader);//还可以加缓冲

        /*FileReader fileReader = new FileReader("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\my.txt");*///fileReader使用默认方式UTF-8读取,造成乱码

//--------------------------------------------------------
        //OutputStreamWriter:将FileOutputStream(字节流)转换为FileWriter(字符流),中间添加编码表
        /*OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\my.txt", true), "GBK");//此时将字节输出流转换成了字符输出流
        writer.write("看看我乱码了吗?");//要在文件explorer中查看GBK编码的my.txt,idea中查看默认使用的是UTF-8,一定会乱码
        writer.close();*/
//        BufferedWriter bufferedWriter = new BufferedWriter(writer);//还可以加缓冲

        /*FileWriter fileWriter = new FileWriter("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\my.txt", true);*///默认使用平台UTF-8
//--------------------------------------------------------

        /*从JDK11开始,字符流提供的带有编码的构造方法
         * 1.字符输入流指定编码读取
         * new BufferedReader(new FileReader("文件路径",Charset.forName("编码表名称")))
         * FileReader(参数1,参数2)
         * 参数1:文件路径
         * 参数2:编码表 Charset.forName("编码表名称") "GBK" "UTF8"
         * 实际上这个2参的FileReader构造函数内部实际上还是调用的InputStreamReader(new FileInputStream(filename),charset)
         */
        /*BufferedReader br = new BufferedReader(new FileReader("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\my.txt", Charset.forName("GBK")));
        System.out.println(br.readLine());
        br.close();*/
        //2.字符输出流指定编码编码写出
        //FileWriter(参数1:文件路径,参数2:编码表,参数3:续写开关)
        BufferedWriter bw = new BufferedWriter(new FileWriter("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\my.txt", Charset.forName("GBK"), true));
        bw.write("看看我是不是还是乱码?");
        bw.close();

    }
}
